package Server.server.work;

import Server.provider.ServiceProvider;
import common.Message.RpcRequest;
import common.Message.RpcResponse;
import lombok.AllArgsConstructor;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.Socket;

@AllArgsConstructor
public class WorkThread implements Runnable {
    // 建立网络连接
    private Socket socket;
    // 本地服务注册中心
    private ServiceProvider serviceProvider;

    @Override
    public void run() {
        try {
            // 响应数据（RpcResponse）发送客户端
            ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
            // 从客户端接受数据，读取序列化对象
            ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
            // 接受客户端发送的RpcRequest对象
            RpcRequest request = (RpcRequest) in.readObject();
            // 反射调用服务端方法获取返回值
            RpcResponse response = getRpcResponse(request);
            // 向客户端写入response
            out.writeObject(response);
            out.flush();

        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    // 处理客户端请求，返回RpcResponse对象
    private RpcResponse getRpcResponse(RpcRequest request) {
        // 服务名
        String interfaceName = request.getInterfaceName();
        // 根据服务名获取服务对象
        Object service = serviceProvider.getService(interfaceName);
        // 反射调用方法
        Method method;
        try {
            // 根据方法名获取方法
            method = service.getClass().getMethod(request.getMethodName(), request.getParamTypes());
            // 反射调用方法(根据传入参数动态选择执行的方法)
            Object invoke = method.invoke(service, request.getParams());
            // 返回RpcResponse对象
            return RpcResponse.success(invoke);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("调用方法出错");
            return RpcResponse.fail();
        }
    }
}
